package cn.edu.csmzxy.rk233x.auth_system.util;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
/**
 * @author wumxing
 * @date 2025/10/15 9:55
 * @description  JWT 工具类
 */
@Slf4j
@Component
public class JwtUtil {
    // 从配置文件读取JWT密钥（JJWT 0.12.x需转换为SecretKey）
    @Value("${jwt.secret}")
    private String secret;
    // Token过期时间（毫秒）
    @Value("${jwt.expiration}")
    private Long expiration;
    // 生成SecretKey（JJWT 0.12.x强制要求，避免旧版字符串密钥）
    private SecretKey getSecretKey() {
        return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
    }
    // 生成Token（用户名作为唯一标识）
    public String generateToken(String username) {
        Date now = new Date();
        Date expirationDate = new Date(now.getTime() + expiration);
        return Jwts.builder()
                .subject(username)  // Token主题（存储用户名）
                .issuedAt(now)       // 签发时间
                .expiration(expirationDate)  // 过期时间
                .signWith(getSecretKey())  // 签名算法
                .compact();
    }
    // 从Token解析用户名
    public String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .verifyWith(getSecretKey())  // 验证密钥（0.12.x新API）
                .build()
                .parseSignedClaims(token)
                .getPayload();
        return claims.getSubject();
    }
    // 验证Token有效性
    public boolean validateToken(String token) {
        try {
            Jwts.parser()
                    .verifyWith(getSecretKey())
                    .build()
                    .parseSignedClaims(token);
            return true;
        } catch (JwtException | IllegalArgumentException e) {
            log.error("Token验证失败：{}", e.getMessage());
            return false;
        }
    }
}